/* ********************************************************************************
 *  *      Copyright:  (C) 2023 LingYun IoT System Studio.
 *   *                  All rights reserved.
 *    *
 *     *       Filename:  logger.h
 *      *    Description:  This file is common logger API functions
 *       *
 *        *        Version:  1.0.0(11/08/23)
 *         *         Author:  Guo Wenxue <guowenxue@gmail.com>
 *          *      ChangeLog:  1, Release initial version on "11/08/23 16:18:43"
 *           *
 *            ********************************************************************************/

#ifndef  _LOGGER_H_
#define  _LOGGER_H_

#include <stdio.h>
#include <stdarg.h>

#define LOG_VERSION "v0.1"

/*  log level */
enum {
	LOG_LEVEL_ERROR,
	LOG_LEVEL_WARN,
	LOG_LEVEL_INFO,
	LOG_LEVEL_DEBUG,
	LOG_LEVEL_TRACE,
	LOG_LEVEL_MAX
};

enum {
	LOG_LOCK_DISABLE, /*  disable lock */
	LOG_LOCK_ENABLE,  /*  enable lock */
};

#define ROLLBACK_NONE          0

/*  description: Initial the logger system
 *   * arguments  :
 *    *             $fname: logger file name, NULL/"console"/"stderr" will log to console
 *     *             $level: logger level above;
 *      *             $size : logger file max size in KiB
 *       *             $lock : thread lock enable or not
 *        * return     : <0: Failed  ==0: Sucessfully
 *         */
#define THREAD_LOCK_NONE       0
#define THREAD_LOCK_EN         1
int log_open(char *fname, int level, int size, int lock);


/*  description: Terminate the logger system */
void log_close(void);


/*  description: log message into log file. Don't call this function directly. */
void _log_write(int level, const char *file, int line, const char *fmt, ...);


/*  description: dump a buffer in hex to logger file */
void log_dump(int level, const char *prompt, char *buf, size_t len);

/*  function: log message into logger file with different log level */
#define log_trace(...) _log_write(LOG_LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) _log_write(LOG_LEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define log_info(...)  _log_write(LOG_LEVEL_INFO,  __FILE__, __LINE__, __VA_ARGS__)
#define log_warn(...)  _log_write(LOG_LEVEL_WARN,  __FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) _log_write(LOG_LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__)

#endif
